import pathlib

import os
import re
from collections import deque
from pathlib import Path
input_file = r'E:\test\dir'
root_path = r'D:\项目学习资料'

# def main():
#     # 创建路径
#     basedir = Path(input_file)
#     path = pathlib.Path(basedir/'ODMS_SX')
#     path.mkdir(parents=True, exist_ok=True)
#     outfile = path.__str__()
#     print(path)
#     print(outfile)
#     return

bank_map={'2465': '中国银行黑龙江省分行',
 '2021': '中国银行吉林省分行汽车厂支行',
 '2118': '中国银行吉林省分行上海路支行',
 '2289': '中国银行吉林省分行西安大路支行',
 '2023': '中国银行吉林省分行开发区支行', '2024': '中国银行吉林省分行建设街支行',
 '2129': '中国银行吉林省分行工农大路支行', '2128': '中国银行吉林省分行大经路支行',
 '2295': '中国银行吉林省分行吉林大路支行', '2120': '中国银行吉林省分行朝阳支行',
 '2294': '中国银行吉林省分行榆树支行', '2015': '中国银行吉林省分行九台支行',
 '2019': '中国银行吉林省分行德惠支行', '2214': '中国银行吉林市分行',
 '2288': '中国银行吉林船营支行', '2287': '中国银行吉林龙潭支行', '2028': '中国银行吉林昌邑支行',
 '2296': '中国银行吉林市分行蛟河支行', '2202': '中国银行延边州分行',
 '2286': '中国银行延边州分行敦化支行', '2009': '中国银行延边州分行安图支行',
 '2016': '中国银行延边州分行珲春支行', '2012': '中国银行延边州分行图门支行',
 '2010': '中国银行延边州分行龙井支行', '2104': '中国银行四平市分行',
 '2109': '中国银行四平市分行英城支行', '2108': '中国银行四平市分行铁东支行',
 '2290': '中国银行四平市分行公主岭支行', '2161': '中国银行通化市分行',
 '2292': '中国银行通化市分行梅河口支行', '2291': '中国银行通化市分行集安支行',
 '2011': '中国银行通化市分行辉南支行', '2201': '中国银行白城市分行',
 '2014': '中国银行白城市分行大安支行', '2160': '中国银行辽源市分行',
 '2027': '中国银行东吉支行', '2298': '中国银行辽源市分行桥西支行',
 '2299': '中国银行辽源市分行东丰支行', '2284': '中国银行松原市分行',
 '2022': '中国银行松原市分行油田支行', '2020': '中国银行松原市分行宁江支行',
 '2285': '中国银行白山市分行', '2293': '中国银行白山市分行抚松支行',
 '2112': '中国银行吉林省分行新民大街支行', '2208': '中国银行吉林省分行',
 '2545': '中国银行佳木斯市顺和支行', '2540': '中国银行佳木斯市保卫支行',
 '2541': '中国银行佳木斯市建设支行',
 '2326': '中国银行黑河市开发区支行', '2310': '中国银行绥化市西城区支行',
 '2311': '中国银行鹤岗市站前支行', '2321': '中国银行双鸭山市四马路支行',
 '2312': '中国银行大兴安岭地区加格达奇支行', '2316': '中国银行七台河市新兴支行',
 '2303': '中国银行伊春市南岔支行', '2502': '中国银行齐齐哈尔市分行',
 '2501': '中国银行牡丹江市分行', '2503': '中国银行佳木斯市分行',
 '2530': '中国银行大庆市分行', '2516': '中国银行黑河市分行',
 '2519': '中国银行绥化市分行', '2518': '中国银行鸡西市分行',
 '2515': '中国银行鹤岗市支行', '2520': '中国银行双鸭山市分行',
 '2544': '中国银行大兴安岭地区分行', '2521': '中国银行七台河市分行',
 '2513': '中国银行双城支行', '2534': '中国银行尚志支行',
 '2546': '中行五常支行', '2319': '中国银行巴彦支行', '2341': '中国银行哈尔滨市霁虹支行',
 '2542': '中国银行克山支行', '2535': '中国银行依安支行', '2307': '中国银行龙江支行',
 '2552': '中国银行讷河支行', '2522': '中国银行绥芬河支行',
 '2300': '中国银行海林支行', '2309': '中国银行穆棱支行',
 '2538': '中国银行宁安支行', '2550': '中国银行东宁支行',
 '2548': '中国银行富锦支行', '2523': '中国银行同江支行',
 '2511': '中国银行阿城支行', '2554': '中国银行呼兰支行',
 '2517': '中国银行北安支行', '2302': '中国银行嫩江支行',
 '2557': '中国银行海伦支行', '2527': '中国银行安达支行',
 '2539': '中国银行肇东支行', '2525': '中国银行密山支行',
 '2524': '中国银行虎林支行', '2543': '中国银行勃利支行',
 '2514': '中国银行伊春市分行',
 '2510': '中国银行哈尔滨市兆麟支行',
 '2547': '中国银行哈尔滨市南岗支行',
 '2512': '中行道里支行', '2526': '中国银行哈尔滨市道外支行',
 '2332': '中国银行哈尔滨市动力支行', '2322': '中国银行哈尔滨市开发区支行',
 '2334': '中国银行哈尔滨市平房支行', '2301': '中国银行大庆市开发区支行',
 '2533': '中国银行大庆市卧里屯支行', '2323': '中国银行大庆市红岗支行', '2531': '中国银行大庆市高台子支行', '2330': '中国银行大庆市朝阳沟支行', '2529': '中国银行大庆市林源支行', '2532': '中国银行大庆市创业庄支行', '2555': '中国银行大庆市东风路支行', '2345': '中国银行大庆油田支行', '2528': '中国银行齐齐哈尔市富拉尔基支行', '2320': '中国银行齐齐哈尔市永兴支行', '2537': '中国银行牡丹江市裕民支行', '2553': '中国银行牡丹江市光华支行', '1405': '内蒙分行', '1594': '新华支行', '1314': '新城支行', '1598': '中国银行内蒙分行车站支行', '1307': '中国银行内蒙分行中山支行', '1599': '中国银行内蒙分行玉泉支行', '1316': '中国银行内蒙分行八拜支行',
 '1581': '中国银行赤峰分行', '1310': '中国银行元宝山支行', '1305': '中国银行宁城支行',
 '1311': '中国银行巴林左旗支行',
 '1582': '中国银行集宁分行', '1301': '中国银行丰镇支行', '1583': '中国银行包头分行',
 '1595': '中国银行东河支行',
 '1596': '中国银行青山支行', '1317': '中国银行昆区支行',
 '1318': '中国银行九原支行', '1584': '中国银行海拉尔分行',
 '1586': '中国银行通辽分行', '1587': '中国银行鄂尔多斯分行', '1309': '中国银行达拉特支行', '1588': '中国银行乌兰浩特分行', '1589': '中国银行二连浩特分行', '1590': '中国银行乌海分行', '1315': '中国银行乌达支行', '1591': '中国银行巴彦浩特分行', '1306': '中国银行吉兰泰分理处', '1592': '中国银行临河分行', '1308': '中国银行乌拉特前旗支行', '1593': '中国银行锡林浩特分行', '1585': '中国银行满洲里分行', '1041': '中国银行山西省分行', '1049': '中国银行太原市鼓楼支行',
 '1075': '中国银行太原市漪汾支行', '1134': '中国银行太原市平阳支行', '1073': '中国银行太原市并州支行', '1099': '中国银行太原市滨河支行', '1022': '中国银行太原市古交支行', '1013': '中国银行太原市清徐支行', '1169': '中国银行大同市分行', '1009': '中国银行大同市分行左云支行', '1017': '中国银行大同市分行矿务局支行', '1167': '中国银行朔州市分行', '1088': '中国银行朔州市平朔支行', '1042': '中国银行朔州市朔城区支行', '1298': '中国银行朔州市平鲁区支行', '1008': '中国银行山阴县支行', '1016': '中国银行朔州市怀仁县支行', '1299': '中国银行朔州市应县支行', '1284': '中国银行忻州分行', '1289': '中国银行原平市支行', '1294': '中国银行五台县支行', '1006': '中国银行定襄县支行', '1285': '中国银行晋中市分行', '1068': '中国银行晋中市分行灵石办事处', '1059': '晋中市分行介休支行',
 '1290': '中国银行晋中市分行太谷支行',
 '1021': '中国银行晋中市分行祁县支行', '1095': '中国银行晋中市分行榆社支行',
 '1283': '中国银行运城分行', '1043': '中国银行闻喜县支行',
 '1011': '中国银行永济市支行', '1054': '中国银行河津市支行',
 '1069': '河津支行禹门支行', '1282': '中国银行临汾分行',
 '1291': '中国银行侯马市支行', '1057': '中国银行洪洞县支行',
 '1024': '中国银行霍州市支行', '1286': '中国银行阳泉市分行',
 '1293': '中国银行平定县支行', '1044': '中国银行盂县支行',
 '1287': '中国银行晋城市分行', '1048': '中国银行阳城县支行',
 '1055': '中国银行高平市支行', '1023': '中国银行沁水县支行',
 '1288': '中国银行离石分行', '1047': '中国银行交城县支行',
 '1015': '中国银行汾阳县支行', '1010': '中国银行孝义市支行',
 '1281': '中国银行长治市分行', '1012': '中国银行长治市分行潞城市支行',
 '1058': '中国银行长治市分行沁县支行', '1046': '中国银行长治市分行黎城县支行',
 '1025': '中国银行长治市分行襄垣县支行', '1096': '中国银行长治市分行长治县分理处',
 '2111': '中国银行吉林丰满支行'}

rettxn_config = {
    # 会变的数据
    "tab_name"    : "SBS3.RETTXN",
    "user"        : "SBS3",
    "tab_comm"    : "交易历史文件",
    "cols_amt"    : 35,
    "recs_amt"    : 0,
    "sep"         : "|",
    "part_info"   : 0,
    "sys_name"    : "SBS",
    "sys_ver"     : "V03.01",
    "sys_comm"    : "UNIX综合业务系统",
    "infc_id"     : "HB",
    "daterange"   : "ERYDAT",

    # 按省份输出
    "config_paths": ['', '', '', ''],      # 山西、内蒙、吉林、黑龙江
    "back_times"  : ['', '', '', ''],
    "part_infos"  : [0, 0, 0, 0],
    "recs_amts"   : [0, 0, 0, 0]
}


def rettxn_test():

    print(rettxn_config["tab_name"])
    print(rettxn_config.get("user"))
    rettxn_config["recs_amts"][0] = 100
    print((rettxn_config["recs_amts"][0]))

    return

# 机构号下表索引
ACTVHH_INDEX = 1
RETTXN_INDEX = 13
RETTXN_INDEX_B = 15
CDTDLG_INDEX = 20
CDTDLG_INDEX_B = 21
def index_test() :

    with open(r"E:\测试数据\RETTXN\SBS3.RETTXN-SBS3-20060830-A-b.p02", "r" , encoding= 'utf8') as f:
        records = f.readlines()
        for record in records:
            # print(record)
            target = record.split("|")
            raw_value = target[RETTXN_INDEX].strip()
            if raw_value == "":
                raw_value = target[RETTXN_INDEX_B]
            print(raw_value)
    return


root_path = r"E:\测试数据\RETTXN"
# 最终数据去重
def data_deduplication(processing_path):
    # 设计文件输出路径
    file_path = pathlib.Path(processing_path)
    # 设计输出文件名
    filename_head = pathlib.Path(processing_path).name
    # 定义去重集合
    unique = set()
    # 定义文件记录缓存
    # 扫描当前目录下所有文件
    for file in pathlib.Path(processing_path).iterdir():
        if file.is_file():
            with open(file, "r", encoding= 'utf8') as f:
               lines = f.readlines()
               for index in range(1 , len(lines)-1):
                   if lines[index] in unique:
                       # 捕获到重复数据
                       print("捕获到重复数据: " + lines[index])
                   else:
                        unique.add(lines[index])
            # 删除当前已处理完毕的文件
        # try:
        #     file.unlink()  # 等同于 os.remove(file)
        # except OSError as e:
        #     print(f'删除失败: {file}  {e}')
    # # 最终输出文件
    # part = 0
    # while unique:
    #     # 创建文件
    #     part = part + 1
    #     filename = filename_head + f'-A-b.p00{part}'
    #     with open(filename, "w", encoding= 'utf8') as f:
    #         count = 0
    #         #   写入文件 写入1600000 条记录 跳出循环
    #         for record in unique:
    #             # count 用于统计当前文件记录数
    #             count += 1
    #             parts = record.split('|')
    #             parts[0] = str(count)
    #             f.write('|'.join(parts))
    #             unique.remove(record)
    #             if count > 1600000 : break
    # 假设 unique 是一个可迭代的去重记录集合（如 set 或 list）
    unique = deque(unique)  # 转为双端队列，支持高效 popleft
    part = 0
    BATCH_SIZE = 1_600_000
    # 配置文件参数获取 =======================
    while unique:
        part += 1
        filename = f"{filename_head}-A-b.p{part:03d}"  # 格式化为 p001, p010, p100 等
        with open(file_path/ filename, "w", encoding='utf-8') as f:
            print(f'文件输出路径：{file_path/filename}')
            f.write('|||BEGIN|||\n')
            count = 0
            while unique and count < BATCH_SIZE:
                record = unique.popleft()  # 安全弹出
                count += 1
                parts = record.split('|')
                parts[0] = str(count)  # 重写序号（注意：这是文件内序号，不是全局）
                f.write('|'.join(parts))
                # 注意：如果原记录末尾没有换行符，可能需要加 \n
                # f.write('|'.join(parts) + '\n')
            f.write('|||END|||\n')

    return


def scan_files_non_recursive(root_path):
    root = pathlib.Path(root_path)
    if not root.exists() or not root.is_dir():
        raise ValueError("无效目录")
    files = [f for f in root.iterdir() if f.is_file()]
    # for file in files:
    #     deduplicate_by_field(file)
    for file in files:
        print(file)
    return
def test_filename() :
    filename = 'SBS3.ACTVHH-SBS3-20050831-A-b.p01'
    names = filename.split('-')
    print(names[2])
    print(names)
    return

def test_list():
    out = ''
    path = pathlib.Path(root_path)
    out = path
    print(out)
    config_paths = [''] * 4
    print(config_paths)
    infc_ids = [''] * 4
    print(len(infc_ids))
    # 备份时间
    back_times = [''] * 4
    print(back_times)
    # 输出个数
    part_infos = [0] * 4
    print(part_infos)
    # 文件条数
    recs_amts = [0] * 4
    print(recs_amts)
    print(bank_map.get('1284'))
    return

def main():

    # str = '1|1234567890123456789|20250929000000000|1314730|00|00011|01|1234567890123456789   |测试01                                                                  |150102430722202   |999E||0|10000|10000|20000|0|0|E|091601|0010|2301|73|2301|73|XXX3||1500|0|19908.66|18408.66|0|0| |          | |0| | |0|1| |      |                              |^ENDROW'
    #
    # out = str.split('|')
    # for i in range(0 , len(out)):
    #     print(f'{i} -> {out[i]}')
    # print(len(out))
    # test_list()
    # rettxn_test()
    # index_test()

    # print(str)
    data_deduplication(root_path)
    return



if __name__ == "__main__":
    main()